package com.beauty.inventory.service;

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
 * 分布式锁服务接口
 */
public interface DistributedLockService {
    
    /**
     * 获取锁并执行业务逻辑
     * 
     * @param lockKey 锁的键
     * @param waitTime 等待获取锁的最长时间
     * @param leaseTime 持有锁的时间，过期后自动释放
     * @param timeUnit 时间单位
     * @param supplier 获取锁后执行的业务逻辑
     * @param <T> 返回类型
     * @return 业务逻辑的执行结果
     * @throws InterruptedException 等待锁时被中断
     */
    <T> T executeWithLock(String lockKey, long waitTime, long leaseTime, 
                          TimeUnit timeUnit, Supplier<T> supplier) throws InterruptedException;
    
    /**
     * 使用默认配置获取锁并执行业务逻辑（等待10秒，持有30秒）
     * 
     * @param lockKey 锁的键
     * @param supplier 获取锁后执行的业务逻辑
     * @param <T> 返回类型
     * @return 业务逻辑的执行结果
     * @throws InterruptedException 等待锁时被中断
     */
    <T> T executeWithLock(String lockKey, Supplier<T> supplier) throws InterruptedException;
    
    /**
     * 尝试获取锁，不等待
     * 
     * @param lockKey 锁的键
     * @param leaseTime 持有锁的时间，过期后自动释放
     * @param timeUnit 时间单位
     * @return 是否获取到锁
     */
    boolean tryLock(String lockKey, long leaseTime, TimeUnit timeUnit);
    
    /**
     * 释放锁
     * 
     * @param lockKey 锁的键
     */
    void unlock(String lockKey);
} 